package utils

import (
	"context"
	"errors"
	"net/http"
	"strconv"
	"time"

	"github.com/gorilla/sessions"

	"go_user_manager/pkg/framework"
)

const (
	// 调用sso验证的一些key
	SSO_COOKIE_NAME = "sso_token"
	SSO_VALID       = "https://sso.xiaoduoai.com/background/validate"
	SESSION_NAME    = "session_id_agentCloud"
)

type SessionData struct {
	UserId   string
	Name     string
	Email    string
	DeptId   string
	DeptName string
}

var store = sessions.NewCookieStore([]byte("agasdfjaj2Jkasd{{P}"))

func GetSessionData(ctx context.Context, logger framework.Logger, req *http.Request) (SessionData, error) {
	// 优先从 request 的 context 中获取 session 信息
	sessionValues, ok := ctx.Value("sessionValues").(map[interface{}]interface{})
	// 其次考虑从请求的 cookie 找到 session 数据
	if !ok || sessionValues == nil {
		session, err := store.Get(req, SESSION_NAME)
		logger.Info("取得用户cookie的信息", err)
		if err != nil || session == nil || len(session.Values) == 0 {
			logger.Error("用户未登录！", errors.New("用户未登录"))
			return SessionData{}, errors.New("用户未登录")
		}
		sessionValues = session.Values
	}

	// 检查 sessionValues 是否为空
	if sessionValues == nil {
		return SessionData{}, errors.New("用户未登录！")
	}
	sessionData := SessionData{
		UserId:   sessionValues["user_id"].(string),
		Name:     sessionValues["name"].(string),
		Email:    sessionValues["email"].(string),
		DeptId:   sessionValues["dept_id"].(string),
		DeptName: sessionValues["dept_name"].(string),
	}
	return sessionData, nil
}

func ValidTimeStampExpire(logger framework.Logger, expireTimeStr string) bool {
	// 验证过期时间，判断是否过期
	expireTimeInt, err := strconv.ParseInt(expireTimeStr, 10, 64)
	if err != nil {
		logger.Error("解析过期时间失败", err)
		return false
	}
	// 验证过期时间
	expireTime := time.Unix(expireTimeInt, 0)
	if time.Now().After(expireTime) {
		return false
	}
	logger.Info("时间戳有效")
	return true
}
